home *** CD-ROM | disk | FTP | other *** search
- /*
- * lock_file - functions for file locking
- *
- * You may freely copy, distribute and reuse the code in this example.
- * This code is provided AS IS without warranty of any kind, expressed
- * or implied, as to its fitness for any particular use.
- *
- * Copyright 1995 Ralph Zazula (rzazula@next.com). All Rights Reserved.
- *
- */
-
- #include "lock_file.h"
- #include <libc.h>
- #include <stdio.h>
- #include <errno.h>
-
- int lock_file(char *filename)
- /*
- * Drops a lock file "filename.lock" for "filename". Returns:
- * LOCK_SUCCESS (0) success
- * LOCK_EXIST (-1) lock file already exists
- * LOCK_NOCREATE (-2) couldn't create lock file
- */
- {
- int fd;
- char lockfile[MAXPATHLEN+1];
-
- sprintf(lockfile, "%s.lock", filename);
- fd = open(lockfile, O_RDWR | O_CREAT | O_EXCL, 0660);
- if(fd < 0) {
- if(errno == EEXIST) {
- /* check age of lock file */
- struct stat st;
- if(!stat(lockfile, &st)) {
- if((time(NULL) - st.st_mtime) >= 3600) {
- #ifdef DEBUG
- fprintf(stderr, "removing stale lock file for %s\n",filename);
- #endif
- unlink(lockfile);
- fd = open(lockfile, O_RDWR | O_CREAT | O_EXCL, 0660);
- if(fd < 0) {
- if(errno == EEXIST) {
- #ifdef DEBUG
- fprintf(stderr, "couldn't remove lock file for %s\n",filename);
- #endif
- } else {
- #ifdef DEBUG
- fprintf(stderr, "couldn't create lock file for %s\n",filename);
- #endif
- }
- return LOCK_NOCREATE;
- } else {
- close(fd);
- return LOCK_SUCCESS;
- }
- } else {
- return LOCK_EXIST;
- }
- } else {
- #ifdef DEBUG
- fprintf(stderr, "couldn't stat %s\n",lockfile);
- #endif
- return LOCK_EXIST;
- }
- } else {
- #ifdef DEBUG
- fprintf(stderr, "cannot create lock file %s\n", lockfile);
- #endif
- return LOCK_NOCREATE;
- }
- } else {
- close(fd);
- }
- return LOCK_SUCCESS;
- }
-
- int unlock_file(char *filename)
- /*
- * removes the lock file "filename.lock" for "filename".
- * Returns LOCK_SUCCESS on success and a negative error code on failure.
- * The error code is that which resulted from the attempted unlink().
- */
- {
- char lockfile[MAXPATHLEN+1];
-
- sprintf(lockfile, "%s.lock", filename);
- if(!unlink(lockfile)) {
- return LOCK_SUCCESS;
- }
- return errno;
- }
-